home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / Scroller.C < prev    next >
C/C++ Source or Header  |  1990-12-20  |  5KB  |  235 lines

  1. //$Scroller,ScrollClipper$
  2. #include "Scroller.h"
  3. #include "ScrollBar.h"
  4. #include "Clipper.h"
  5. #include "View.h"
  6.  
  7. class ScrollClipper: public Clipper {
  8. public:
  9.     ScrollClipper(VObject *v, Point minsize, int id) : Clipper(v, minsize, id)
  10.     { }
  11.     void Control(int id, int part, void *val)
  12.     { VObject::Control(id, part, val); }
  13. };
  14.  
  15. //---- Scroller ----------------------------------------------------------------
  16.  
  17. MetaImpl(Scroller, (TP(vf), TE(controls), TE(visibleControls), TP(vop), T(ms), 0));
  18.  
  19. Scroller::Scroller(VObject *v, Point e, int id, ScrollDir w)
  20.                     : CompositeVObject(id, (Collection*) 0)
  21. {
  22.     controls= w;
  23.     vop= v;
  24.     ms= e;
  25.     Init(v, e, id);
  26. }
  27.  
  28. void Scroller::Init(VObject *v, Point e, int id)
  29. {
  30.     visibleControls= eScrollNone;
  31.     for (int i= 0; i<4; i++)
  32.     if (controls & BIT(i))
  33.         Add(sb[i]= new ScrollBar(cIdNone/*i+1111*/, (Direction) EVEN(i)));
  34.     Add(vf= new ScrollClipper(v, e, id));
  35. }
  36.  
  37. void Scroller::Open(bool mode)
  38. {
  39.     VObject::Open(mode);
  40.     vf->Open(mode);
  41. }
  42.  
  43. void Scroller::Control(int id, int part, void *val)
  44. {
  45.     switch (part) {
  46.     case cPartScrollPos:
  47.     BubbleUpdate(*((Point*)val));
  48.     break;
  49.     
  50.     case cPartViewSize:
  51.     ViewSizeChanged(*((Point*)val));
  52.     break;
  53.     
  54.     case cPartScrollPage:
  55.     case cPartScrollRel:
  56.     case cPartScrollStep:
  57.     case cPartScrollAbs:
  58.     case cPartScrollHAbs:
  59.     case cPartScrollVAbs:
  60.     vf->Scroll(part, *((Point*)val));
  61.     break;
  62.     
  63.     default:
  64.     CompositeVObject::Control(id, part, val);
  65.     break;
  66.     }
  67. }
  68.  
  69. void Scroller::BubbleUpdate(Point bs)
  70. {
  71.     for (int i= 0; i<4; i++)
  72.     if (visibleControls & BIT(i))
  73.         sb[i]->BubbleUpdate(bs);
  74. }
  75.  
  76. bool Scroller::NeedControls(Point e, Point vs)
  77. {
  78.     ScrollDir lastVisibleControls= visibleControls;
  79.     
  80.     visibleControls= (ScrollDir)(controls & ~eScrollHideScrolls);
  81.     if (controls & eScrollHideScrolls) {
  82.     if (vs.x < e.x)    // we don't need horizontal scrollbars
  83.         visibleControls= (ScrollDir)(visibleControls&~(eScrollUp | eScrollDown));
  84.     if (vs.y < e.y)    // we don't need vertical scrollbars
  85.         visibleControls= (ScrollDir)(visibleControls&~(eScrollLeft | eScrollRight));
  86.     }
  87.     return visibleControls != lastVisibleControls;
  88. }
  89.  
  90. void Scroller::ViewSizeChanged(Point newviewsize)
  91. {
  92.     Point e= GetExtent();
  93.  
  94.     if (NeedControls(e, newviewsize)) {
  95.     SetExtent(e);
  96.     SetOrigin(GetOrigin());
  97.     ForceRedraw();
  98.     } else {
  99.     for (int i= 0; i<4; i++)
  100.         if (visibleControls & BIT(i))
  101.         sb[i]->ViewSizeChanged(newviewsize);
  102.     }
  103. }
  104.  
  105. void Scroller::Draw(Rectangle r)
  106. {
  107.     GrSetPenNormal();
  108.     GrStrokeRect(vf->contentRect.Expand(gPoint1));
  109.     CompositeVObject::Draw(r);
  110. }
  111.  
  112. Metric Scroller::GetMinSize()
  113. {
  114.     Point clipperSize, sbSizes, ee;
  115.  
  116.     clipperSize= vf->GetMinSize().extent;
  117.     for (int i= 0; i < 4; i++) {
  118.     if (controls & BIT(i))
  119.         ee= sb[i]->GetMinSize().extent;
  120.     else
  121.         ee= gPoint1;
  122.     if (EVEN(i)) {      // right & left scrollbar
  123.         sbSizes.x+= ee.x;
  124.         clipperSize.y= max(clipperSize.y, ee.y);
  125.     } else {            // up & down scrollbar
  126.         sbSizes.y+= ee.y;
  127.         clipperSize.x= max(clipperSize.x, ee.x);
  128.     }
  129.     }
  130.     return clipperSize + sbSizes;
  131. }
  132.  
  133. void Scroller::SetBgInk(Ink *bg)
  134. {
  135.     vf->SetBgInk(bg);
  136. }
  137.  
  138. Ink *Scroller::GetBgInk()
  139. {
  140.     return vf->GetBgInk();
  141. }
  142.  
  143. void Scroller::SetExtent(Point e)
  144. {
  145.     Point ee, eee, viewExtent= vf->GetViewSize().extent;
  146.  
  147.     VObject::SetExtent(e);
  148.     
  149.     NeedControls(e, viewExtent);
  150.  
  151.     if (visibleControls & eScrollUp)
  152.     e.y-= sb[3]->GetMinSize().extent.y;
  153.     else
  154.     ee.y--;
  155.     
  156.     if (visibleControls & eScrollDown)
  157.     e.y-= sb[1]->GetMinSize().extent.y;
  158.     else
  159.     ee.y--;
  160.     
  161.     if (visibleControls & eScrollLeft)
  162.     e.x-= sb[2]->GetMinSize().extent.x;
  163.     else
  164.     ee.x--;
  165.  
  166.     if (visibleControls & eScrollRight)
  167.     e.x-= sb[0]->GetMinSize().extent.x;
  168.     else
  169.     ee.x--;
  170.  
  171.     ee+= e;
  172.  
  173.     for (int i= 0; i<4; i++) {
  174.     if (controls & BIT(i)) {
  175.         if (visibleControls & BIT(i)) {
  176.         eee= sb[i]->GetMinSize().extent;
  177.         if (EVEN(i))
  178.             eee.y= e.y;
  179.         else
  180.             eee.x= e.x;
  181.         if (!sb[i]->IsOpen())
  182.             sb[i]->Open(TRUE);
  183.         sb[i]->Init(eee, ee, viewExtent);
  184.         } else {
  185.         if (sb[i]->IsOpen())
  186.             sb[i]->Open(FALSE);
  187.         }
  188.     }
  189.     }
  190.     vf->SetExtent(ee);
  191. }
  192.  
  193. void Scroller::SetOrigin(Point at)
  194. {
  195.     Point left, pp(1), middle= vf->GetExtent();
  196.     
  197.     VObject::SetOrigin(at);
  198.    
  199.     if (visibleControls & eScrollLeft)
  200.     pp.x= left.x= sb[2]->Width();
  201.     if (visibleControls & eScrollUp)
  202.     pp.y= left.y= sb[3]->Height();
  203.     
  204.     vf->SetOrigin(at+pp);
  205.     
  206.     if (visibleControls & eScrollRight)
  207.     sb[0]->SetOrigin(at+Point(pp.x+middle.x, left.y));
  208.     if (visibleControls & eScrollDown)
  209.     sb[1]->SetOrigin(at+Point(left.x, pp.y+middle.y));
  210.     if (visibleControls & eScrollLeft)
  211.     sb[2]->SetOrigin(at+Point(0, left.y));
  212.     if (visibleControls & eScrollUp)
  213.     sb[3]->SetOrigin(at+Point(left.x, 0));        
  214. }
  215.  
  216. ostream& Scroller::PrintOn(ostream &s)
  217. {
  218.     VObject::PrintOn(s);
  219.     return s << vop SP << controls SP << ms SP;
  220. }
  221.  
  222. istream& Scroller::ReadFrom(istream &s)
  223. {
  224.     VObject::ReadFrom(s);
  225.     FreeAll();
  226.     s >> vop >> Enum(controls) >> ms;
  227.     Init(vop, ms, GetId());
  228.     SetExtent(GetExtent());
  229.     if (vf) {   // CSE
  230.     vf->SetFlag(eVObjOpen);
  231.     vop->AddToClipper(vf);
  232.     }
  233.     return s;
  234. }
  235.